package Entities; import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import Control.DisplayControl; import Helper.AtomicOperations; public class Server extends Thread { private AtomicOperations operations; private int sleepingTime; private BlockingQueue<Task> taskQueue; private int simulationTime; private int finishTime; private int serverID; private DisplayControl controler; public Server(int serverID, int simulationTime, int finishTime, DisplayControl controler, int sleep) { taskQueue = new ArrayBlockingQueue<Task>(100); this.serverID = serverID; this.simulationTime = simulationTime; this.finishTime = finishTime; this.sleepingTime = sleep; this.controler = controler; this.controler.displayServers(serverID); operations = new AtomicOperations(); } public void receiveTask(Task task, int receivingTime) { try { task.setServiceTime(task.getServiceTime() + receivingTime); System.out.println("task finishes at " + task.getServiceTime()); taskQueue.put(task); operations.numberOfTasks.getAndIncrement(); int i = 0; for (Task currentTask : taskQueue) { System.out.println(currentTask + " in server " + serverID); controler.displayTask(currentTask.toString(), serverID * 15 + i); i++; } } catch (InterruptedException e) { System.out.println("Cannot put task " + task); } } public BlockingQueue<Task> getTaskQueue() { return taskQueue; } @Override public void run() { while (simulationTime <= finishTime) { if (simulationTime == finishTime) { System.out.println("\ntotal tasks in server" + serverID + ": " + operations.numberOfTasks.get()); System.out.println( "total waiting time for server " + serverID + ": " + operations.totalWaitingTime.get()); break; } int i = 0; for (Task task : taskQueue) { controler.hideTask(serverID * 15 + i); if (task.getServiceTime() == simulationTime) { task.setFinishTime(simulationTime); task.setWaitingTime(); operations.totalWaitingTime.getAndAdd(task.getWaitingTime()); try { taskQueue.take(); } catch (InterruptedException e) { System.out.println("Cannot take task from server " + serverID); } } i++; } i = 0; for (Task currentTask : taskQueue) { System.out.println(currentTask + " in server " + serverID); controler.displayTask(currentTask.toString(), serverID * 15 + i); i++; } try { Thread.sleep(sleepingTime); } catch (InterruptedException e) { System.out.println("Error sleeping in server thread"); } simulationTime++; } } }